const Koa = require('koa');
const cors = require('@koa/cors');
const http = require('http');
const koaStatic = require('koa-static'); // 引入 koa-static
const mount = require('koa-mount'); // 引入 koa-mount
const path = require('path'); // 引入 path 模块
require('dotenv').config(); // 加载环境变量

// 导入自定义模块
const fileUtils = require('./modules/fileUtils');
const dataGenerator = require('./modules/dataGenerator');
const routes = require('./modules/routes');
const websocket = require('./modules/websocket');
const scheduler = require('./modules/scheduler');

// 初始化数据文件
async function initDataFiles() {
    // 确保数据目录存在
    fileUtils.ensureDataDir();

    // 初始化所有数据文件（如果不存在）
    const fileKeys = Object.keys(fileUtils.dataFiles).filter(key => key !== 'dataDir');

    for (const fileKey of fileKeys) {
        if (!fileUtils.fileExists(fileKey)) {
            const generator = dataGenerator.generators[fileKey];
            if (generator) {
                const data = generator();
                await fileUtils.writeDataFile(fileKey, data);
                console.log(`已初始化数据文件: ${fileKey}`);
            }
        }
    }
}

// 启动服务器
async function startServer() {
    try {
        // 初始化数据文件
        await initDataFiles();

        // 创建Koa应用
        const app = new Koa();

        // 中间件
        app.use(cors());
        app.use(mount('/static', koaStatic(path.join(__dirname, '/static'), {
            extensions: ['json'] // 支持的文件扩展名
        })));
        app.use(routes.routes());
        app.use(routes.allowedMethods());

        // 创建HTTP服务器
        const server = http.createServer(app.callback());

        // 创建WebSocket服务器
        const wss = websocket.createWebSocketServer(server);

        // 启动定时任务
        const schedulers = scheduler.startSchedulers(wss);

        // 优雅关闭
        process.on('SIGINT', () => {
            console.log('正在关闭服务器...');
            scheduler.stopSchedulers(schedulers);

            // 关闭WebSocket连接
            wss.clients.forEach(client => {
                client.terminate();
            });

            server.close(() => {
                console.log('HTTP服务器已关闭');
                process.exit(0);
            });
        });

        // 启动HTTP服务器
        const PORT = process.env.PORT || 3000;
        server.listen(PORT, () => {
            console.log(`服务器已启动，监听端口 ${PORT}`);
            console.log('静态文件目录已配置:', path.join(__dirname, '/static'));
        });
    } catch (error) {
        console.error('启动服务器失败:', error);
        process.exit(1);
    }
}

// 执行启动
startServer();

module.exports = {
    startServer
};